package com.hspedu.homework;

/**
 * @author DL5O
 * @version 1.0
 */
public class Homework06 {
    public static void main(String[] args) {
        Person tang = new Person("唐僧",new Horse());
        tang.common();
        tang.passRiver();
        tang.common();
        tang.passRiver();
        tang.common();
        tang.volcano();
    }
}


/*
1.有一个交通工具接口类Vehicles，有work接口
2.有Horse类和Boat类分别实现Vehicles
3.//有意思，动脑筋. 5min完成.…
1。有一个交通工具接口类Vehicles，有work接口2.有Horse类和Boat类分别实现Vehicles
3．创建交通工具工厂类，有两个方法分别获得交通工具Horse和Boat
4、有Person类，有name和Vehicles属性，在构造器中为两个属性赋值
5．实例化Person对象“唐僧”，要求一般情况下用Horse作为交通工具，遇到大河时用Boat
作为交通工具
6.使用代码实现上面的要求
 */
interface Vehicles{
    void work();
}

class Horse implements Vehicles{

    @Override
    public void work() {
        System.out.println("一般情况下，使用House前进");
    }
}

class Boat implements Vehicles{

    @Override
    public void work() {
        System.out.println("过河，使用Boat前进");
    }
}

class Airplane implements Vehicles{

    @Override
    public void work() {
        System.out.println("过火焰山，使用Airplane前进");
    }
}

//创建交通工具类，有两个方法分别获得交通工具Horse和Boat
class VehiclesFactory{
    //我们认为马儿始终是同一批
    private static Horse house= new Horse();//饿汉式

    private VehiclesFactory() {
    }

    public static Horse getHouse(){
        return house;
    }

    public static Boat getBoat(){
        return new Boat();
    }

    public static Airplane getAirplane(){
        return new Airplane();
    }

}

class Person{
    private String name;
    private Vehicles vehicles;

    //在创建人对象时，事先分配一个交通工具
    //如何不浪费，在构建对象时，传入的交通工具对象->动脑筋
    public Person(String name, Vehicles vehicles) {
        this.name = name;
        this.vehicles = vehicles;
    }
    //实例化Person对象“唐僧”，要求一般情况下用Horse作为交通工具，遇到大河时用Boat
    //作为交通工具
    //这里涉及到一个编程思想，就是可以把具体的要求，封装成方法
    public void  passRiver(){
        //判断一下当前的交通工具是什么
        if(!(vehicles instanceof Boat)){//instanceof 是用来判断运行类型的！！！！！！
            //这里使用的是多态，向上转型
            vehicles = VehiclesFactory.getBoat();
        }
        //这里体现使用接口调用
        vehicles.work();
    }

    public void common(){
        //得到马儿
        //判断一下，当前的vehicle 属性是null，就获取一匹马
        if(!(vehicles instanceof Horse)){
            //这里使用的是多态，向上转型
            vehicles = VehiclesFactory.getHouse();
        }
        //这里体现使用接口调用
        vehicles.work();
    }

    public void volcano(){
        if (!(vehicles instanceof Airplane)){
            vehicles = VehiclesFactory.getAirplane();
        }
        vehicles.work();
    }

}

